package main

import "fmt"

func main() {
	sender := &Sender{}
	sender.Subscuribe(&Receiver{})
	sender.Subscuribe(&Receiver{})
	sender.NotifyObs("hello all!")
}

/* 最简单的观察者模式
- 首先定义观察者接口，所有观察者（订阅者）都实现这个接口
- 实现发布者主体（接收事件的方法、遍历订阅者、调用消息发送）
- 实现订阅者主体（接收到事件后执行的情况）
*/

// 观察者接口
type Observer interface {
	Update(msg string) error
}

// 发布者主体
type Subject interface {
	Subscuribe(Observer) error
	NotifyObs(msg string) error
}

type Sender struct {
	Obs []Observer
}

func (s *Sender) Subscuribe(b Observer) error {
	s.Obs = append(s.Obs, b)
	return nil
}

func (s *Sender) NotifyObs(msg string) error {
	fmt.Println("get a event to send: ", msg)
	for i := range s.Obs {
		s.Obs[i].Update(msg)
	}
	return nil
}

// 观察者主体
type Receiver struct {
	name string
}

func (r *Receiver) Update(msg string) error {
	fmt.Println("receive msg: ", msg)
	return nil
}

func (r *Receiver) SetName(name string) {
	r.name = name
}
